package lambda05;

import org.junit.Test;
import java.util.function.Consumer;
/**
 * Consumer接口中的默认方法
 *   //当我们需要对同一个内容执行一个连续操作,可以使用andThen
 *   //同时也可以利用andThen完成链式编程
 *
 *
 *   default Consumer<T> andThen(Consumer<? super T> after) {
 *         Objects.requireNonNull(after);
 *         return (T t) -> { accept(t); after.accept(t); };
 *   }
 * 需求:要求首先打印一个字符串的长度,接着再去将这个字符串全部转换成大写后再打印
 */
public class ComsumerDemo02 {
    @Test
    public void test01(){
        method("abc",
                str-> System.out.println(str.length()), // 打印一个字符串的长度
                str-> System.out.println(str.toUpperCase())); // 将这个字符串全部转换成大写后再打印
    }

    public void method(String str,Consumer<String> c1, Consumer<String> c2){
        //  Consumer<String> c1   打印一个字符串的长度
        // Consumer<String> c2   将这个字符串全部转换成大写后再打印

        /*c1.accept(str);  // 3
        c2.accept(str);   // ABC*/
        c1.andThen(c2).accept(str);
        // 先执行 c1.accept(str) 然后执行 c2.accept(str)
    }
}
/*
* 1.c1.andThen(c2)
*
*  default Consumer<T> andThen(Consumer<? super T> after) {
          Objects.requireNonNull(after);   //如果after为null,则抛空指针异常
          //return (T t) -> { this.accept(t); after.accept(t); };
          //return (String t)->{c1.accept(t);c2.accept(t);}
          //return new ConsumerDemo02$$Lambda$1();//返回一个Lambda表达式相当于返回该Lambda表达式对应的实现类对象
   }
*
*2. new ConsumerDemo02$$Lambda$1().accept("abc")
*
*  //(String t)->{c1.accept(t);c2.accept(t);}该Lambda表达式对应实现类
*
* class ConsumerDemo02$$Lambda$1 implements Consumer<String>{
*      public void accept(String t){   //String t="abc"
*        c1.accept(t);    //c1.accept("abc");
*        c2.accept(t);    //c2.accept("abc")
*     }
* }
*
*/